// 定义和登录相关的接口
const md5 = require('md5')
const express = require('express')
// 引入处理token的工具对象
const tm = require('../utils/tokenManger')
const router = express.Router()
// 引入管理员集合对象
const adminModel = require('../db/adminModel')

// 登录接口
router.post('/login', async (req, res) => {
  // 获取用户上传的信息
  const { username, password } = req.fields

  try {
    // 查询数据库中是否有这个信息
    // 注意: 用户上传的password是明文,但是数据库中存储的是秘文,所以要先将明文加密,然后再查询
    const user = await adminModel.findOne({
      name: username,
      psw: md5(password),
    })
    // 判断用户是否存在,存在则认为登录成功,不存在则认为用户名或密码输入错误
    if (user) {
      // 登录成功
      // 1. 生成token
      const token = tm.en(user._id)
      // 2. 把token存储到当前用户的token字段中
      await adminModel.updateOne({ _id: user._id }, { $set: { token } })
      // 3. 响应用户
      res.send({ code: 2, data: token, message: '登录成功' })
    } else {
      // 登录失败
      // 响应用户
      res.send({ code: 1, data: null, message: '用户名或密码错误' })
    }
  } catch (error) {
    res.send({ code: 1, data: null, message: '网络错误,请稍后再试' })
  }
})

// 校验token的接口
router.post('/verifyToken', async (req, res) => {
  // 接收请求头中的token
  const token = req.get('token')

  // 判断是否上传了token
  if (token) {
    // 校验token是否是正确的(看数据库中是否存储了这个token)
    const user = await adminModel.findOne({ token })
    if (user) {
      // 找到token了
      // 解析token
      const { id, expires } = tm.de(token)
      // 判断解析后的id和当前通过token找到的用户信息的id是否一致
      if (id == user._id) {
        // 一致,说明token是正确
        // 判断token是否过期
        if (expires > Date.now()) {
          // 没过期
          res.send({ code: 2, data: null, message: 'token有效' })
        } else {
          // 过期了
          res.send({ code: 3, data: null, message: 'token过期,请重新登录' })
        }
      } else {
        res.send({ code: 1, data: null, message: '您还没有登录,请先登录' })
      }
      // 响应用户
    } else {
      // 没有token
      res.send({ code: 1, data: null, message: '您还没有登录,请先登录' })
    }
  } else {
    res.send({ code: 1, data: null, message: '您还没有登录,请先登录' })
  }
})

// 退出登录
router.get('/logout', async (req, res) => {
  // 获取当前登录用户的token
  const token = req.get('token')
  try {
    // 根据token找到当前登录的用户,然后将数据库中token的值设置为空字符串
    await adminModel.updateOne({ token }, { $set: { token: '' } })
    // 响应用户
    res.send({ code: 2, data: null, message: '退出成功' })
  } catch (error) {
    res.send({ code: 1, data: null, message: '网络问题,请稍后再试' })
  }
})

module.exports = router
